package com.aust.reflect;

import java.io.FileOutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;

/**
 * 在程序运行时动态地获取类的信息、操作对象的属性和方法，即使这些属性和方法是 private 的，也可以访问。
 */
public class Reflect8 {

    /**
     * 保存任意对象的字段和其数据到文件中去
     *
     * @param obj
     */
    public static void saveObject(Object obj) throws Exception {
        PrintStream ps = new PrintStream(new FileOutputStream("obj.txt", true));
        Class<?> aClass = obj.getClass();
        ps.println("=====" + aClass.getSimpleName() + "=====");
        Field[] fields = aClass.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            String name = field.getName();
            String value = field.get(obj) + "";
            ps.println(name + "=" + value);
        }
        ps.close();
    }

    public static void main(String[] args) throws Exception {
        Animal animal = new Animal("老虎", 8, "母");
        Dog dog = new Dog("小狗", 3);
        saveObject(animal);
        saveObject(dog);
    }
}
